package com.ultrawise.survey.common.utils;

import java.util.*;
import java.text.*;

public class DateUtils
{
	public DateUtils()
	{
	}

	/**
	 * 取strStartDate开始的第intDays个工作日的日期
	 * 
	 * @param strStartDate
	 *            String
	 * @param intDays
	 *            int
	 * @return String
	 */
	public static String getWorkingDay(String strStartDate, int intDays)
	{
		String strEndDate = "";
		String strFeria = "01-01,01-02,01-03,04-04,04-05,04-06,05-01,05-02,05-03,10-01,10-02,10-03,10-04,10-05,10-06,10-07";
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try
		{
			Date dat = format.parse(strStartDate);
			Calendar ca = Calendar.getInstance();
			ca.setTime(dat);
			ca.add(ca.DATE, -1); // 前一天日期，便于循环计算包括当天在内的5个工作日（不包括周末、元旦、五一和国庆）之后日期
			for (int i = 0; i < intDays; i++)
			{
				ca.add(ca.DATE, 1); // 日期加一天
				int dayOfWeek = ca.get(ca.DAY_OF_WEEK); // 计算当天是一周的星期几，返回1－7对应星期日－星期六
				int isFeria = strFeria.indexOf(format.format(ca.getTime()).substring(6, 10)); // 判断当天是否在元旦、五一和国庆中
				if (dayOfWeek == 1 || dayOfWeek == 7 || isFeria >= 0)
				{ // 如果当天是周末或者在3个大假中循环增加一次
					i--;
				}
			}
			strEndDate = format.format(ca.getTime());
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return strEndDate;
	}

	/**
	 * 取strStartDate开始的第intDays个工作日的日期
	 * 
	 * @param strStartDate
	 *            String
	 * @param strParameterFeria
	 *            String
	 * @param strParameterWorkday
	 *            String
	 * @param intDays
	 *            int
	 * @param strParameter
	 *            String
	 * @return String
	 */
	public static String getWorkingDayByParamter(String strStartDate, int intDays)
	{
		String strEndDate = "";
		String strFeria = "";
		String strWorkday = "";
		// 节假日期
		strFeria = "01-01,01-02,01-03,01-22,01-23,01-24,01-25,01-26,01-27,01-28,04-02,04-03,04-04,"
				+ "04-29,04-30,05-01,06-22,06-23,06-24,09-30,10-01,10-02,10-03,10-04,10-05,10-06,10-07";
		if (strFeria == null || strFeria.equals(""))
		{
			return null;
		}
		// 工作日
		strWorkday = "12-31,01-21,01-29,03-31,04-01,04-28,09-29";

		DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try
		{
			Date dat = format.parse(strStartDate);
			Calendar ca = Calendar.getInstance();
			ca.setTime(dat);
			ca.add(ca.DATE, -1); // 前一天日期，便于循环计算包括当天在内的5个工作日（不包括周末、元旦、五一和国庆）之后日期
			for (int i = 0; i < intDays; i++)
			{
				ca.add(ca.DATE, 1); // 日期加一天
				int dayOfWeek = ca.get(ca.DAY_OF_WEEK); // 计算当天是一周的星期几，返回1－7对应星期日－星期六
				/* 判断周末否是调休的工作日 */
				if (strWorkday != null && !strWorkday.equals(""))
				{
					int isWorkday = strWorkday.indexOf(format.format(ca.getTime()).substring(6, 10));
					if (isWorkday >= 0)
					{
						dayOfWeek = -1;
					}
				}
				/* 判断结束 */
				int isFeria = strFeria.indexOf(format.format(ca.getTime()).substring(6, 10)); // 判断当天是否在元旦、五一和国庆中
				if (dayOfWeek == 1 || dayOfWeek == 7 || isFeria >= 0)
				{ // 如果当天是周末或者在3个大假中循环增加一次
					i--;
				}
			}
			strEndDate = format.format(ca.getTime());
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return strEndDate;
	}

	/**
	 * 比较两个日期字符串的大小 返回 -1:strDate1 < strDate2 返回 0：strDate1 = strDate2 返回 1：strDate1 > strDate2
	 * 
	 * @param strDate1
	 *            String
	 * @param strDate2
	 *            String
	 * @return int
	 */
	public static int compareDate(String strDate1, String strDate2)
	{
		int intResultValue = 0;
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try
		{
			Date dat1 = format.parse(strDate1);
			Date dat2 = format.parse(strDate2);
			intResultValue = dat1.compareTo(dat2);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return intResultValue;
	}

	/**
	 * 字符串转换成日期
	 * 
	 * @param strDate
	 *            String
	 * @return Date
	 */
	public static Date toShortDate(String strDate)
	{
		Date dat = null;
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try
		{
			dat = format.parse(strDate);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return dat;
	}

	public static Date toDate(String strDate)
	{
		Date dat = null;
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try
		{
			dat = format.parse(strDate);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return dat;
	}

	/**
	 * 按传入的规则取日期
	 * 
	 * @param strFormat
	 *            String
	 * @return String
	 */
	public static String getDate(String strFormat)
	{
		if (strFormat == null || strFormat.equals(""))
		{
			strFormat = "yyyy-MM-dd";
		}
		SimpleDateFormat format = new SimpleDateFormat(strFormat);
		Date dat = new Date(System.currentTimeMillis());
		String buffer = format.format(dat);
		return buffer;
	}

	public static String getDate(String strFormat, String strStartDate, int intDays)
	{
		String strResult = "";
		if (strFormat == null || strFormat.equals(""))
		{
			strFormat = "yyyy-MM-dd";
		}
		DateFormat format = new SimpleDateFormat(strFormat);
		try
		{
			if (strStartDate == null || strStartDate.equals(""))
			{
				strStartDate = getDate(strFormat);
			}
			Date dat = format.parse(strStartDate);
			Calendar ca = Calendar.getInstance();
			ca.setTime(dat);
			ca.add(ca.DATE, intDays);
			strResult = format.format(ca.getTime());
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return strResult;
	}

	public static String Format(String strFormat, String strDate)
	{
		String buffer = "";
		DateFormat format = new SimpleDateFormat(strFormat);
		try
		{
			Date dat = toShortDate(strDate);
			buffer = format.format(dat);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return buffer;
	}

	/**
	 * 日期转换成字符串
	 * 
	 * @param dat
	 *            Date
	 * @param strFormat
	 *            String
	 * @return String
	 */
	public static String toString(Date dat, String strFormat)
	{
		String strDate = "";
		DateFormat format = new SimpleDateFormat(strFormat);
		try
		{
			strDate = format.format(dat);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return strDate;
	}

	public static String toStringAll(Date dat)
	{
		String strDate = "";
		String strFormat = "yyyy-MM-dd HH:mm:ss.SSS";
		DateFormat format = new SimpleDateFormat(strFormat);
		try
		{
			strDate = format.format(dat);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return strDate;
	}

	/**
	 * 
	 * <p>
	 * <b>功能描述:将日期转换成中文</b>
	 * <ul>
	 * <li>可见性原因：需要被其他应用调用</li>
	 * <li>目的：检查签名</li>
	 * <li>适用的前提条件:</li>
	 * <li>后置条件：</li>
	 * <li>例外处理：无</li>
	 * <li>已知问题：</li>
	 * <li>调用的例子：</li>
	 * </ul>
	 * </p>
	 * 
	 * @param date
	 * @return
	 */
	public static String getChineseYearMont(String date)
	{
		StringBuffer dateStr = new StringBuffer();
		String[] dateary = date.split("-");
		if (dateary != null && dateary.length > 1 && dateary[0] != null)
		{
			dateStr.append(dateary[0] + "年");
		}
		if (dateary != null && dateary.length > 1 && dateary[1] != null)
		{
			dateStr.append(dateary[1] + "月");
		}
		if (dateary != null && dateary.length > 2 && dateary[2] != null)
		{
			dateStr.append(dateary[2] + "日");
		}
		return dateStr.toString();
	}

	/**
	 * 日期进行格式化后返回日期类型
	 * 
	 * @param dat
	 *            Date
	 * @param strFormat
	 *            String
	 * @return String
	 */
	public static Date dateFormat(Date date)
	{
		DateFormat dateFormat;
		dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
		dateFormat.setLenient(false);
		if (null != date)
		{
			String strDate = dateFormat.format(date);// string类型
			java.util.Date timeDate = null;
			try
			{
				timeDate = dateFormat.parse(strDate);
			} catch (ParseException e)
			{
				e.printStackTrace();
			}
			java.sql.Date dateTime = new java.sql.Date(timeDate.getTime());// sql类型
			return dateTime;
		} else
		{
			return date;
		}
	}
/*
	public static void main(String[] args)
	{
		System.out.println(getChineseYearMont("2012-12-12"));
		System.out.println("Time::::" + toStringAll(new Date()));
	}*/
}
